﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpReview
{
    class Program
    {
        static int countLei = 0;
        static int countMa = 0;
        static int countSpace = 0;

        static Dictionary<int, StudentInfo> students = new Dictionary<int , StudentInfo>();

        static void Main(string[] args)
        {
            
            #region 一、统计下面一段文字中“类”字和“码”的个数。
            string str = "与其他面向对象语言一样，C# 语言也具有面向对象语言的基本特征，即封装、继承、 多态。封装：就是将代码看作一个整体，例如使用类、方法、接口等。在使用定义好的类、 方法、接口等对象时不必考虑其细节，只需要知道其对象名以及所需要的参数即可，也是一种提升代码安全性的方法。继承：是一种体现代码重用性的特性，减少代码的冗余，但在 C# 语言中仅支持单继承。多态：不仅体现了代码的重用性，也体现了代码的灵活性，它主要通过继承和实现接口的方式，让类或接口中的成员表现出不同的作用。";
            //1、使用循环遍历的方法来实现。
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] == '类')
                {
                    countLei++;
                }
                else if (str[i] == '码')
                {
                    countMa++;
                }
            }
            Console.WriteLine(FormatStr("循环遍历"));

            //2、使用Replace方法来实现。
            string delLeiStr = str.Replace("类", "");
            countLei = str.Length - delLeiStr.Length;
            string delMaStr = str.Replace("码", "");
            countMa = str.Length - delMaStr.Length;
            Console.WriteLine(FormatStr("Replace方法"));

            //3、使用Split()方法来实现。
            string[] splitByLei = str.Split('类');
            countLei = splitByLei.Length - 1;
            string[] splitByMa = str.Split('码');
            countMa = splitByMa.Length - 1;
            Console.WriteLine(FormatStr("Split方法"));
            #endregion

            #region 二、去掉一段文字的所有空格，并统计空格数。
            string str2 = "C# (英 文名为 CSharp) 是 微  软开发的一种 面向对 象的 编程 语言。C# 语言具备了面向对象 语言 的特 征，  即封装、继承、多态，并且添加了  事件和委托，增强了 编程的灵 活性。C# 语 言是  一种安全的、稳定的、简 单 的、面向对象的编程 语言 ，其语 法与 C++ 类似，但在编程过  程中要比 C++ 简单；它不仅去掉了 C++ 和 Java 语  言中的一些复杂特性，还提  供了可视化 工具，能够高效地 编写程序。C# 是运行  在.NE  T平台之上的  编程 语言。";
            string delSpaceStr = str2.Replace(" ","");
            countSpace = str2.Length - delSpaceStr.Length;

            Console.WriteLine($"共删去{countSpace}个空格\n删去空格后的文字如下:\n{delSpaceStr}\n");
            #endregion

            #region 对象
            #region 用户
            //1.然后在主方法调用输出；
            Users user1 = new Users();
            user1.Account = "张三";
            user1.Password = "111";
            user1.PrintUserInfo();
            #endregion
            #region 学生
            //2.在主方法实例化对象，赋值并输出
            Students zhan = new Students();
            zhan.Id = 1;
            zhan.Name = "张三";
            zhan.Gender = "男";
            zhan.Age = -1;
            zhan.Major = "犯罪";
            zhan.PrintStudentInfo();

            #endregion
            #region 书籍 
            //3.在主方法实例化对象，赋值并输出
            Books book1 = new Books();
            book1.Isbn = "1513841";
            book1.BookName = "书名";
            book1.Price = 20;
            book1.Author = "作者";
            book1.PrintBookInfo();
            #endregion
            #endregion
            
            #region 蝙蝠战车
            BatCar bat = new BatCar();
            bat.Brand = "batCar";
            bat.Run();
            bat.Fly();
            Console.WriteLine();
            #endregion

            #region 计算图形面积（重载）
            CalcGraphicArea graphic = new CalcGraphicArea();

            int r = 2;
            double roundArea = graphic.RetrunGraphicArea(r);
            Console.WriteLine($"半径为{r}的圆形面积为{roundArea}");

            int length = 3;
            int width = length;
            int blockArea = graphic.RetrunGraphicArea(length, width);
            Console.WriteLine($"长为{length},宽为{width}的方形面积为{blockArea}");
            #endregion

            #region 计算工具类
            SumUtils calc = new SumUtils();
            Console.WriteLine($"1 + 1 = {calc.calc(1,1)}");
            Console.WriteLine($"2.56 + 1.28 = {calc.calc(2.56,1.28)}");
            Console.WriteLine($"你 + 好 = {calc.calc("你","好")}");
            Console.WriteLine($"1~20之和为{calc.calc(20)}");
            #endregion

            SelectFunction();
        }

        static string FormatStr(string str)
        {
            return $"{str}\n‘类’的个数为:{countLei}\n‘码’的个数为:{countMa}。\n";
        }

        static void SelectFunction()
        {
            Console.WriteLine("请选择：1、添加学生信息。2、删除学生信息 3、查询学生信息。");
            int key = int.Parse(Console.ReadLine());

            switch (key)
            {
                case 1:
                    AddStudentInfo();
                    break;
                case 2:
                    DelStudentInfo();
                    break;
                case 3:
                    QueryStudentInfo();
                    break;
                default:
                    Console.WriteLine("输入错误！");
                    SelectFunction();
                    break;
            }
        }

        private static void QueryStudentInfo()
        {
            Console.WriteLine("请选择：1、查询所有（按学号排序）2、查询所有（按姓名排序），3、查询所有（按年龄排序）4、按学号查询（查没有，则打印查无此学生）5、退出");
            int key = int.Parse(Console.ReadLine());

            List<StudentInfo> studenSort = students.Values.ToList();

            switch (key)
            {
                case 1:
                    studenSort.Sort(new SortByID());
                    PrintList(studenSort);
                    SelectFunction();
                    break;
                case 2:
                    studenSort.Sort(new SortByName());
                    PrintList(studenSort);
                    SelectFunction();
                    break;
                case 3:
                    studenSort.Sort(new SortByAge());
                    PrintList(studenSort);
                    SelectFunction();
                    break;
                case 4:
                    Console.WriteLine("请输入学生的学号：");
                    int id = int.Parse(Console.ReadLine());

                    if (students.ContainsKey(id))
                    {
                        Console.WriteLine(students[id]);
                        SelectFunction();
                    }
                    else
                    {
                        Console.WriteLine("查无此学生!");
                        SelectFunction();
                    }
                    break;
                case 5:
                    System.Environment.Exit(0);
                    break;
                default:
                    Console.WriteLine("输入错误！");
                    SelectFunction();
                    break;
            }
        }

        private static void PrintList(List<StudentInfo> studenSort)
        {
            foreach (StudentInfo s in studenSort)
            {
                Console.Write(s);
            }
        }

        private static void DelStudentInfo()
        {
            Console.WriteLine("请输入要删除学生的学号：");
            int id = int.Parse(Console.ReadLine());
            if (students.ContainsKey(id))
            {
                students.Remove(id);
                Console.WriteLine("删除成功！");
                SelectFunction();
            }
            else
            {
                Console.WriteLine("不存在的学号！");
                SelectFunction();
            }
        }

        private static void AddStudentInfo()
        {
            Console.WriteLine("请输入学号：");
            int id = int.Parse(Console.ReadLine());
            if (students.ContainsKey(id))
            {
                Console.WriteLine("重复的学号！");
                SelectFunction();
            }
            else
            {
                StudentInfo stu = new StudentInfo();
                stu.id = id;
                Console.WriteLine("请输入学生姓名：");
                stu.name = Console.ReadLine();
                Console.WriteLine("请输入学生年龄：");
                stu.age = int.Parse(Console.ReadLine());
                students.Add(id, stu);
                SelectFunction();
            }
        }
    }
}
